﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Eco.Services;
using Eco.ObjectRepresentation;

namespace CommonClasses.Utility
{
    /// <summary>
    /// Форма, запршивающая у пользователя выбор нескольких элементов из исходного списка
    /// </summary>
    /// <typeparam name="T">Тип элементов списка</typeparam>
    public partial class CollectionEditForm<T> : Form
    {
        static IList<T> sourceItems;
        static IList<T> targetItems;
        static IUndoService Undo;
        bool result = false;

        private CollectionEditForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Осуществить запрос к пользователю
        /// </summary>
        /// <param name="caption">Заголовок окна запроса</param>
        /// <param name="provider">ECO-сервис центр</param>
        /// <param name="source">Список элементов, из которых происходит выбор</param>
        /// <param name="existing">Список, редактирование которого производится</param>
        /// <returns>Отредактированный список</returns>
        public static IList<T> Edit(string caption, IEcoServiceProvider provider, IList<T> source, IList<T> existing)
        {
            sourceItems = new List<T>();
            targetItems = existing;
            Undo = provider.GetEcoService<IUndoService>();            
            var form = new CollectionEditForm<T>();

            form.Text = caption;
            foreach (var item in source)
            {
                form.sourceLB.Items.Add(item);
                sourceItems.Add(item);
            }
            foreach (var item in existing)
            {
                form.targetLB.Items.Add(item);                
            }

            Undo.StartTransaction();
            form.ShowDialog();

            return targetItems;
        }

        private void AddButton_Click(object sender, EventArgs e)
        {
            int index = sourceLB.SelectedIndex;
            if (index == -1) return;
            targetLB.Items.Add(sourceLB.SelectedItem);
            targetItems.Add(sourceItems[index]);
            sourceLB.Items.Remove(sourceItems[index]);
            sourceItems.RemoveAt(index);            
        }

        private void DelButton_Click(object sender, EventArgs e)
        {
            int index = targetLB.SelectedIndex;
            if (index == -1) return;
            sourceLB.Items.Add(targetLB.SelectedItem);
            sourceItems.Add(targetItems[index]);
            targetLB.Items.Remove(targetItems[index]);
            targetItems.RemoveAt(index);            
        }

        private void OkButton_Click(object sender, EventArgs e)
        {
            result = true;
            this.Close();
        }

        private void CancelButton_Click(object sender, EventArgs e)
        {
            result = false;
            this.Close();
        }

        private void CollectionEditForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (result)
                Undo.CommitTransaction();
            else
                Undo.RollbackTransaction();
        }
    }
}
